home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / Fixation 1.3 / preffile.c < prev    next >
Text File  |  1996-01-27  |  3KB  |  112 lines

  1. /*
  2.     preffile.c by Adam Miller (miller@minerva.cis.yale.edu), 1994
  3.     
  4.     A very easy and modular way to keep a pref file in the System Folder.  It's not
  5.     perfect, but it seems to work okay for me.  If the system is to old, it'll
  6.     just put the pref file in the current folder, but will still work.  There's
  7.     less error checking than there could be, for sure.
  8.     
  9.     To make the file, just call DoSavePrefs, pass a pointer to your data, and the
  10.     length of it.  To get the prefs, call DoReadPrefs in the same way.  DoReadPrefs
  11.     returns the number of bytes it read, so if you change versions and the new version
  12.     uses more data, it's an easy way to check.
  13.     
  14.     The way I use these functions is to have a struct like PrefStruct.  To save, I
  15.     fill it with the relevant values and call
  16.         DoSavePrefs((Ptr) &MyPrefStruct, sizeof(PrefStruct));
  17.     Similar to read, of course.
  18.     
  19.     Report any bugs you find.
  20.     
  21. */
  22.  
  23. #include "preffile.h"
  24. #include <Files.h>
  25.  
  26. //#define preffilename "\pFixation Prefs"        // change this
  27. #define preffilecreator 'fxtn'                // and this
  28. #define preffiletype 'pref'
  29.  
  30. prefStruct gPrefs;
  31.  
  32.     // creates the file
  33. static OSErr DoCreatePrefsFile(short VRefNum, long DirID, Str255 preffilename)
  34. {
  35.    return HCreate(VRefNum, DirID, preffilename, preffilecreator, preffiletype);
  36. }
  37.  
  38.  
  39.     // func returns whether the system is recent enough to find the Sys Folder for us
  40. static int IsFindFolder(void)
  41. {
  42.   OSErr Result;
  43.   long Feature;
  44.  
  45.   Result = Gestalt(gestaltFindFolderAttr, &Feature);
  46.   if (Result == noErr)
  47.       return ((Feature & (1 << gestaltFindFolderPresent)) != 0);        // find relevant bit
  48.   return Result;
  49. }
  50.  
  51.  
  52.     // read the prefs in from the file
  53. long DoReadPrefs(Ptr p, long length, Str255 preffilename)
  54. {
  55.   short VRefNum;
  56.   long DirID;
  57.   short fref;
  58.   OSErr result;
  59.  
  60.     if (IsFindFolder())
  61.         result = FindFolder(kOnSystemDisk, kPreferencesFolderType,
  62.             kDontCreateFolder, &VRefNum, &DirID);
  63.     else
  64.         result = -1;
  65.     if (result) {        // set directory to current directory, tough luck sonny
  66.         VRefNum = 0;
  67.         DirID = 0;
  68.     }
  69.     result = HOpen(VRefNum, DirID, preffilename, fsCurPerm, &fref);
  70.     if (result)    // no existing file, forget it
  71.         return false;
  72.     result = FSRead(fref, &length, p);        // get info
  73.     result = FSClose(fref);
  74.     fref = 0;        // so we don't wipe out any disks (see THINK ref)
  75.     return length;    // let them know how long the file is (can only be shorter, of course)
  76. }
  77.  
  78.  
  79.     // write our data to the pref file
  80. void DoSavePrefs(Ptr p, long length, Str255 preffilename)
  81. {
  82.     short VRefNum;
  83.     long DirID;
  84.     short fref;
  85.     OSErr result;
  86.     
  87.     if (IsFindFolder())
  88.         result = FindFolder(kOnSystemDisk, kPreferencesFolderType,
  89.             kDontCreateFolder, &VRefNum, &DirID);        // find System Folder
  90.     else
  91.         result = -1;
  92.     if (result) {        // set directory to current directory, tough luck sonny
  93.         VRefNum = 0;
  94.         DirID = 0;
  95.     }
  96.     
  97.     result = HOpen(VRefNum, DirID, preffilename, fsCurPerm, &fref);
  98.     if (result) {        // no existing file, make a new one
  99.         result = DoCreatePrefsFile(VRefNum, DirID, preffilename);
  100.         if (result)
  101.             return;        // canna do it
  102.         result = HOpen(VRefNum, DirID, preffilename, fsCurPerm, &fref);
  103.         if (result)
  104.             return;        // couldn't open it
  105.     }
  106.     result = FSWrite(fref, &length, p);      // get info
  107.     if (!result)
  108.         result = SetEOF(fref, length);        // just in case
  109.     result = FSClose(fref);
  110.     result = FlushVol(0, 0);
  111.     fref = 0;        // so we don't wipe out any disks (see THINK ref)
  112. }